extern crate rand;

use rand::distr::Distribution;
use rand::distr::StandardUniform;
use std::{cmp::PartialOrd, fmt::Display};

/// 验证一个 Vec 是否从小到大排序
pub fn assert_vec_asc<T: PartialOrd + Display>(arr: &[T]) {
    for i in 0..arr.len() - 1 {
        assert!(arr[i] <= arr[i + 1])
    }
}

/// 验证一个 Vec 是否从大到小排序
pub fn assert_vec_desc<T: PartialOrd>(arr: &[T]) {
    for i in 0..arr.len() - 1 {
        assert!(arr[i] >= arr[i + 1])
    }
}

/// 生成一个包含 n 个元素的 Vec，每个元素由 `generator` 闭包生成。
pub fn gen_random_vec_with_generator<T>(n: usize, mut generator: impl FnMut() -> T) -> Vec<T> {
    (0..n).map(|_| generator()).collect()
}

/// 随机生成一个包含 n 个元素的 Vec，每个元素都是随机生成的。
pub fn gen_random_vec<T>(n: usize) -> Vec<T>
where
    StandardUniform: Distribution<T>,
{
    gen_random_vec_with_generator(n, || rand::random())
}

/// 随机生成一个包含 n 个元素的 Vec，每个元素都是随机生成的，并且位于 [low, high] 范围内。
pub fn gen_random_range_vec<T>(n: usize, low: T, high: T) -> Vec<T>
where
    T: rand::distr::uniform::SampleUniform + PartialOrd + Copy,
{
    gen_random_vec_with_generator(n, || rand::random_range(low..high))
}
